﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JGSY.Tasks
{
    public static class ThreadPool1
    {
        public static void ThreadPool001()
        {
            // 显示线程池初始状态
            ShowThreadPoolStatus("初始状态");

            // 队列多个短时任务到线程池
            for (int i = 1; i <= 10; i++)
            {
                int taskId = i;
                ThreadPool.QueueUserWorkItem(state => ProcessTask(taskId));
                Console.WriteLine($"任务 {taskId} 已加入线程池");
            }

            // 显示线程池状态变化
            Thread.Sleep(1000);
            ShowThreadPoolStatus("任务执行中");

            // 演示设置线程池最小工作线程数
            Console.WriteLine("\n设置最小工作线程数为10...");
            ThreadPool.SetMinThreads(10, 4);
            ShowThreadPoolStatus("设置最小线程后");

            // 演示使用WaitCallback和状态对象
            Console.WriteLine("\n使用WaitCallback和状态对象...");
            ThreadPool.QueueUserWorkItem(ProcessTaskWithState, "自定义状态数据");

            // 演示使用Task Parallel Library (TPL) 与线程池的集成
            Console.WriteLine("\n使用Task Parallel Library...");
            Task.Run(() => Console.WriteLine("通过Task.Run执行的任务"));
             
            // 演示使用ManualResetEvent等待所有任务完成
            using (ManualResetEvent resetEvent = new ManualResetEvent(false))
            {
                ThreadPool.QueueUserWorkItem(_ => {
                    Console.WriteLine("长时间运行的任务开始...");
                    Thread.Sleep(3000);
                    Console.WriteLine("长时间运行的任务完成");
                    resetEvent.Set();
                });

                Console.WriteLine("等待长时间任务完成...");
                resetEvent.WaitOne();
                Console.WriteLine("长时间任务已完成");
            }

            // 显示最终线程池状态
            ShowThreadPoolStatus("所有任务完成后");

            Console.WriteLine("\n主线程退出");
        }

        static void ProcessTask(int taskId)
        {
            Console.WriteLine($"任务 {taskId} 在线程 {Thread.CurrentThread.ManagedThreadId} 上执行");
            Thread.Sleep(500); // 模拟短时任务
            Console.WriteLine($"任务 {taskId} 完成");
        }

        static void ProcessTaskWithState(object state)
        {
            Console.WriteLine($"带有状态的任务在线程 {Thread.CurrentThread.ManagedThreadId} 上执行");
            Console.WriteLine($"状态数据: {state}");
        }

        static void ShowThreadPoolStatus(string message)
        {
             
            ThreadPool.GetMaxThreads(out int maxWorkerThreads, out int maxCompletionPortThreads);
            ThreadPool.GetAvailableThreads(out int availableWorkerThreads, out int availableCompletionPortThreads);
            ThreadPool.GetMinThreads(out int minWorkerThreads, out int minCompletionPortThreads);

            Console.WriteLine($"\n{message}:");
            Console.WriteLine($"最大工作线程数: {maxWorkerThreads}");
            Console.WriteLine($"最大IO完成端口线程数: {maxCompletionPortThreads}");
            Console.WriteLine($"可用工作线程数: {availableWorkerThreads}");
            Console.WriteLine($"可用IO完成端口线程数: {availableCompletionPortThreads}");
            Console.WriteLine($"最小工作线程数: {minWorkerThreads}");
            Console.WriteLine($"最小IO完成端口线程数: {minCompletionPortThreads}");
        }
    }
}
